package org.dromara.common.redis.config.properties

import org.redisson.config.ReadMode
import org.redisson.config.SubscriptionMode
import org.springframework.boot.context.properties.ConfigurationProperties

/**
 * Redisson 配置属性
 *
 * @author Lion Li
 * @updater LikeYouDo
 * @date 2025/2/1 22:09
 */
@ConfigurationProperties(prefix = "redisson")
open class RedissonProperties(
    /**
     * redis缓存key前缀
     */
    var keyPrefix: String,

    /**
     * 线程池数量,默认值 = 当前处理核数量 * 2
     */
    var threads: Int,

    /**
     * Netty线程池数量,默认值 = 当前处理核数量 * 2
     */
    var nettyThreads: Int,

    /**
     * 单机服务配置
     */
    var singleServerConfig: SingleServerConfig?,

    /**
     * 集群服务配置
     */
    var clusterServersConfig: ClusterServersConfig?,
) {
    class SingleServerConfig(
        /**
         * 客户端名称
         */
        var clientName: String? = null,

        /**
         * 最小空闲连接数
         */
        var connectionMinimumIdleSize: Int = 0,

        /**
         * 连接池大小
         */
        var connectionPoolSize: Int = 0,

        /**
         * 连接空闲超时，单位：毫秒
         */
        var idleConnectionTimeout: Int = 0,

        /**
         * 命令等待超时，单位：毫秒
         */
        var timeout: Int = 0,

        /**
         * 发布和订阅连接池大小
         */
        var subscriptionConnectionPoolSize: Int = 0,
    )

    class ClusterServersConfig(
        /**
         * 客户端名称
         */
        var clientName: String? = null,

        /**
         * master最小空闲连接数
         */
        var masterConnectionMinimumIdleSize: Int = 0,

        /**
         * master连接池大小
         */
        var masterConnectionPoolSize: Int = 0,

        /**
         * slave最小空闲连接数
         */
        var slaveConnectionMinimumIdleSize: Int = 0,

        /**
         * slave连接池大小
         */
        var slaveConnectionPoolSize: Int = 0,

        /**
         * 连接空闲超时，单位：毫秒
         */
        var idleConnectionTimeout: Int = 0,

        /**
         * 命令等待超时，单位：毫秒
         */
        var timeout: Int = 0,

        /**
         * 发布和订阅连接池大小
         */
        var subscriptionConnectionPoolSize: Int = 0,

        /**
         * 读取模式
         */
        var readMode: ReadMode? = null,

        /**
         * 订阅模式
         */
        var subscriptionMode: SubscriptionMode? = null,
    )
}
